package vista;

import dao.DAOInmueble;
import dao.DAOPropietario;
import dao.DAOProvincia;
import entidades.Localidad;
import entidades.Propietario;
import java.awt.Frame;
import java.util.Iterator;
import java.util.Set;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 * Este panel contiene los componentes y las funcionalidades principales para la
 * realización de las operaciones relacionadas con Propietario.
 * Se generara una instancia nueva al seleccionar el botón Inmuebles dentro de 
 * la ventana principal.
 * Las funcionalidades permitidas son:
 * - Agregar
 * - Modificar
 * - Eliminar
 */

public class PListadoPropietarios extends javax.swing.JPanel {

     /**
     * Listado de propietarios que matchean los filtros de busqueda
     * 
     */
    private Vector<Propietario> propietariosBusqueda;
    
    public PListadoPropietarios() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        bAgregar = new javax.swing.JButton();
        bModificar = new javax.swing.JButton();
        bEliminar = new javax.swing.JButton();
        pFiltros = new javax.swing.JPanel();
        lNombre = new javax.swing.JLabel();
        cbTipoDoc = new javax.swing.JComboBox();
        tfNumDoc = new javax.swing.JTextField();
        tfNombre = new javax.swing.JTextField();
        lApellido = new javax.swing.JLabel();
        tfApellido = new javax.swing.JTextField();
        cbProvincia = new javax.swing.JComboBox(DAOProvincia.getAllNombres());
        cbLocalidad = new javax.swing.JComboBox();
        bFiltrar = new javax.swing.JButton();
        spScroll = new javax.swing.JScrollPane();
        tResultados = new javax.swing.JTable();

        setMinimumSize(new java.awt.Dimension(556, 340));

        bAgregar.setText("Agregar");
        bAgregar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bAgregarActionPerformed(evt);
            }
        });

        bModificar.setText("Modificar");
        bModificar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bModificarActionPerformed(evt);
            }
        });

        bEliminar.setText("Eliminar");
        bEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bEliminarActionPerformed(evt);
            }
        });

        pFiltros.setBorder(javax.swing.BorderFactory.createTitledBorder("Filtros"));
        pFiltros.setPreferredSize(new java.awt.Dimension(536, 108));

        lNombre.setText("Nombre:");

        cbTipoDoc.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "DNI", "LC", "PP", "LE" }));

        lApellido.setText("Apellido:");

        cbProvincia.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cbProvinciafiltrarLocalidades(evt);
            }
        });

        cbLocalidad.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Localidad" }));

        bFiltrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/iconos/search_button_green_16.png"))); // NOI18N
        bFiltrar.setText("Filtrar");
        bFiltrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bFiltrarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout pFiltrosLayout = new javax.swing.GroupLayout(pFiltros);
        pFiltros.setLayout(pFiltrosLayout);
        pFiltrosLayout.setHorizontalGroup(
            pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pFiltrosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pFiltrosLayout.createSequentialGroup()
                        .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(cbTipoDoc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lNombre))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(tfNumDoc)
                            .addComponent(tfNombre, javax.swing.GroupLayout.DEFAULT_SIZE, 131, Short.MAX_VALUE)))
                    .addComponent(cbProvincia, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 211, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pFiltrosLayout.createSequentialGroup()
                        .addComponent(lApellido)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfApellido))
                    .addComponent(cbLocalidad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(bFiltrar))
        );
        pFiltrosLayout.setVerticalGroup(
            pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(pFiltrosLayout.createSequentialGroup()
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbTipoDoc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfNumDoc, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lNombre)
                    .addComponent(tfNombre, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lApellido)
                    .addComponent(tfApellido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(pFiltrosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cbLocalidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(bFiltrar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        tResultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "N° Doc.", "Nombre", "Localidad"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tResultados.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        spScroll.setViewportView(tResultados);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(pFiltros, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(spScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 443, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(bEliminar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bAgregar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(bModificar, javax.swing.GroupLayout.DEFAULT_SIZE, 87, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(pFiltros, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(bAgregar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bModificar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bEliminar)
                        .addGap(0, 123, Short.MAX_VALUE))
                    .addComponent(spScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void bAgregarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bAgregarActionPerformed
        JDialog ventanaAlta = new VAltaPropietario(null, true,null,-1);
        ventanaAlta.setVisible(true);
        
        filtrarResultados();
    }//GEN-LAST:event_bAgregarActionPerformed

    private void bModificarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bModificarActionPerformed
        // accion MODIFICAR PROPIETARIO
        // recupero al propietario de la fila seleccionada
        int selectedRow = this.tResultados.getSelectedRow();
        System.out.println("Selectedrow modificar: "+selectedRow);
        if (selectedRow == -1) {
            // si no hay fila seleccionada, no se realiza ninguna acción
            return;
        }

        // recupero el id del propietario de la fila seleccionada
        System.out.println("id_propietariomodificar: "+this.tResultados.getModel().getValueAt(1, 0));
        System.out.println("id_propietariomodificar: "+this.tResultados.getModel().getValueAt(2, 0));
        System.out.println("id_propietariomodificar: "+this.tResultados.getModel().getValueAt(3, 0));
        String numDoc = (String) this.tResultados.getModel().getValueAt(selectedRow, 0);
        System.out.println("id_propietariomodificar: "+numDoc);

        Propietario p = DAOPropietario.getByNumDoc(numDoc);

        JDialog ventanaModificar = new VAltaPropietario(null, true, p, -1);
        ventanaModificar.setVisible(true);
        filtrarResultados();
    }//GEN-LAST:event_bModificarActionPerformed
    
    /**
     * Método auxiliar para buscar Propietarios en base a los criterios de búsqueda
     * ingresados en los campos dispuestos para tal fin.
     * Luego de realizar la búsqueda en la base de datos, se actualiza la tabla
     * de resultados para reflejar los nuevos Propietarios buscados.
     * 
     * El DTOPropietario se utiliza con el fin de encapsular la información que se
     * va a pasar al DAOPropietario.
     */
    
    private void filtrarResultados()
    {
        int tipo_doc = cbTipoDoc.getSelectedIndex();
        String num_doc = tfNumDoc.getText();
        String nombre = tfNombre.getText();
        String apellido = tfApellido.getText();
        
        int provincia_seleccionada = cbProvincia.getSelectedIndex()-1;
        int localidad_seleccionada = cbLocalidad.getSelectedIndex()-1;

        String query = "Propietario ";
        boolean tiene_una_condicion = false;

        // seteamos localidad con su correspendiente provincia en los combobox
        if(localidad_seleccionada > 0) {
            query += " where ";
            tiene_una_condicion = true;
            Object[] localidades = VPrincipal.provincias.get(provincia_seleccionada).getLocalidads().toArray();
            Localidad l = (Localidad) localidades[localidad_seleccionada];
            query += "localidad.idLocalidad = "+l.getIdLocalidad();
        }
        else if(provincia_seleccionada > 0) {
            query += " where ";
            tiene_una_condicion = true;

            Set localidades = VPrincipal.provincias.get(provincia_seleccionada).getLocalidads();
            Iterator iter = localidades.iterator();

            query += " (localidad.idLocalidad = "+((Localidad) iter.next()).getIdLocalidad();

            while(iter.hasNext()) {
                query += " OR localidad.idLocalidad = "+((Localidad) iter.next()).getIdLocalidad();
            }

            query += ")";
        }

        if(tipo_doc > 0) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
                query += " where ";
                tiene_una_condicion = true;
            }

            query += " tipoDoc = '"+cbTipoDoc.getSelectedItem().toString()+"'";
        }

        if(num_doc.length() > 0) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
                query += " where ";
                tiene_una_condicion = true;
            }

            query += " numDoc = '"+num_doc+"'";
        }

        if(nombre.length() > 0) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
                query += " where ";
                tiene_una_condicion = true;
            }

            query += " nombre LIKE '%"+nombre+"%'";
        }

        if(apellido.length() > 0) {
            if(tiene_una_condicion) {
                query += " and ";
            }
            else {
                query += " where ";
                tiene_una_condicion = true;
            }

            query += " apellido LIKE '%"+apellido+"%'";
        }

        propietariosBusqueda = DAOPropietario.get(query);

        actualizarListadoPropietarios();
    }
    
    private void bEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bEliminarActionPerformed
        int selectedRow = this.tResultados.getSelectedRow();

        if (selectedRow == -1) {
            // si no hay fila seleccionada, no se realiza ninguna acción
            return;
        }

        // recupero el codigo del propietario de la fila seleccionada
        String numDoc = (String) this.tResultados.getModel().getValueAt(selectedRow, 0);
        Propietario p = DAOPropietario.getByNumDoc(numDoc);

        // muestro dialogo de confirmacion para asegurar la eliminacion
        int respuesta = JOptionPane.showConfirmDialog(null, "¿Está seguro que desea eliminar el Propietario seleccionado?","Eliminar Propietario",JOptionPane.YES_NO_OPTION);

        if(respuesta == JOptionPane.YES_OPTION){
            if (DAOInmueble.getByIdPropietario(p.getIdPropietario()).isEmpty()) {
                DAOPropietario.delete(p);
                JOptionPane.showMessageDialog(this, "El propietario fue eliminado de la base de datos.", "Propietario Eliminado", JOptionPane.INFORMATION_MESSAGE);
                filtrarResultados();
            }
            else {
                JOptionPane.showMessageDialog(this, "El propietario NO pudo ser eliminado de la base de datos. Si el problema persiste, contacte al desarrollador.", "Error! No se pudo completar la acción", JOptionPane.ERROR_MESSAGE);
            }
        }
    }//GEN-LAST:event_bEliminarActionPerformed

    private void cbProvinciafiltrarLocalidades(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbProvinciafiltrarLocalidades
        int provincia_seleccionada = cbProvincia.getSelectedIndex()-1; //Se resta uno porque el primer ítem es a modo de título

        Set localidades = VPrincipal.provincias.get(provincia_seleccionada).getLocalidads();
        Iterator i = localidades.iterator();

        cbLocalidad.removeAllItems();
        cbLocalidad.addItem("Localidad");

        while(i.hasNext()) {
            cbLocalidad.addItem(((Localidad) i.next()).getNombre());
        }
    }//GEN-LAST:event_cbProvinciafiltrarLocalidades

    private void bFiltrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bFiltrarActionPerformed
        filtrarResultados();
    }//GEN-LAST:event_bFiltrarActionPerformed
     
    /**
     * Método auxiliar para mostrar los resultados de la busqueda
     * de Propietarios en la tabla Propietarios
     */
    public void actualizarListadoPropietarios() 
    {
	limpiarTablaResultados();

	DefaultTableModel modeloResultados = (DefaultTableModel) this.tResultados.getModel();
       

	if(this.propietariosBusqueda != null) {
            int cantResultados = this.propietariosBusqueda.size();
            for(int i = 0; i<cantResultados; i++){
                modeloResultados.addRow(DAOPropietario.convertirPropietarioParaMostrarEnTabla(this.propietariosBusqueda.get(i)));
                
            }
            this.tResultados.repaint();
	}
	else {
            Vector sinResultados = new Vector();
            sinResultados.add("");
            sinResultados.add("<Tabla vacía>");
            sinResultados.add("");
            modeloResultados.addRow(sinResultados);
	}
    }

    /**
    * elimina todos los registros de búsquedas mostrados en la tabla Resultaods
    */
    private void limpiarTablaResultados(){
        DefaultTableModel modeloResultados = (DefaultTableModel) tResultados.getModel();

        // se vacia la tabla de resultados
        while(modeloResultados.getRowCount() > 0)
            modeloResultados.removeRow(0);
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bAgregar;
    private javax.swing.JButton bEliminar;
    private javax.swing.JButton bFiltrar;
    private javax.swing.JButton bModificar;
    private javax.swing.JComboBox cbLocalidad;
    private javax.swing.JComboBox cbProvincia;
    private javax.swing.JComboBox cbTipoDoc;
    private javax.swing.JLabel lApellido;
    private javax.swing.JLabel lNombre;
    private javax.swing.JPanel pFiltros;
    private javax.swing.JScrollPane spScroll;
    private javax.swing.JTable tResultados;
    private javax.swing.JTextField tfApellido;
    private javax.swing.JTextField tfNombre;
    private javax.swing.JTextField tfNumDoc;
    // End of variables declaration//GEN-END:variables
}
